package _220316;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * @author ShadowLim
 * @create 2022-03-16-10:59
 */
public class _k倍区间 {

    /** 参考:https://blog.csdn.net/y1196645376/article/details/69718192
     * 首先统计前缀和sum[i] 表示A1+A2+…+Ai.所以对于任意一段区间[l,r]的和就是sum[r]-sum[l-1].
     * 如果要保证这个区间和为K倍数就是：(sum[r]-sum[l-1])%k == 0.变形后就是：sum[r]%k==sum[l-1]%k，
     * 所以我们计算前缀和的时候顺带模K，然后统计前缀和中相同的数据就行了。复杂度O(n).注意数据可能会溢出！！
     *
     */
    static int n, k;
    static int[] a; // = new int[100010]
    static int[] sum;   // 前缀和   // = new int[100010]
    static Map<Integer, Long> map = new HashMap<>();    // 同余的个数统计

    /**
     * 郑未解法
     * 解析同余的意思：余数相同表示这些区间都是某倍区间
     * 比如： 区间[0,3] [0,5] [1,6] 对k的余数相同（假设余数结果为0） 则这三个区间都是k倍区间 即有C32个k倍区间
     * @param args
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        k = scanner.nextInt();
        a = new int[n + 1];
        sum = new int[n + 1];
        sum[0] = 0;
        map.put(0, 1L);

        for (int i = 1; i <= n; i++) {
            a[i] = scanner.nextInt();
            sum[i] = (sum[i - 1] + a[i]) % k;
            if (map.get(sum[i]) == null) {  // value类型为Long 不是基本数据类型long 所以用null 而不是0
                map.put(sum[i], 1L);
            } else {
                map.put(sum[i], map.get(sum[i]) + 1);
            }
        }

        long ans = 0;
        for (int i = 0; i < k; i++) {   // 余数必然在 0 ~ k - 1之间
            Long cnt = map.get(i);
            if (cnt == null) {  // value类型为Long 不是基本数据类型long 所以用null 而不是0
                cnt = 0L;   // 自动拆箱
            }
            ans += cnt * (cnt - 1) / 2; // 例如前缀和sum中 k= 3 的有3个 则它们（同余）任意两个可以组成一个k倍区间 即 C32(排列组合)
        }
        System.out.println(ans);
    }
}
